package com.zjut.an.util.tools;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;

import javax.annotation.Resource;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.SimplifiedObjectMeta;
import com.zjut.an.config.manager.AnConfigManager;
import com.zjut.zs.file.manager.FilePath;

public class FileDownload {

	@Resource(name = "AnConfigManager")
	private AnConfigManager anconfig;
    
	public SimplifiedObjectMeta downloadFile(String urlString, String idcard) {
		// 获取文件的部分元信息。
		SimplifiedObjectMeta objectMeta = new SimplifiedObjectMeta();
		if(urlString!=null && urlString.trim().length()>0) {
			String filename=urlString.substring(urlString.lastIndexOf("/"),urlString.length());
			String objectName = urlString.replaceAll(FilePath.accessUrl+"/", "");
			if(urlString.contains("?")) {
				filename=urlString.substring(urlString.replace("style/ph400", "").lastIndexOf("/")+1, urlString.lastIndexOf("?"));
				objectName=objectName.substring(0, objectName.indexOf("?"));
			} 
			// 创建OSSClient实例。
			OSS ossClient = new OSSClientBuilder().build(FilePath.endpoint, FilePath.accessKeyId, FilePath.accessKeySecret);
			// 设置URL过期时间为1小时。
			Date expiration = new Date(new Date().getTime() + 3600 * 1000);
			// 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
			URL url = ossClient.generatePresignedUrl(FilePath.bucketName, objectName, expiration);
			// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖，不存在则新建。
			String savePath="d:\\filedownload\\"+idcard+"\\";
			if (null!=anconfig.getSingleConfigInfoByName("佐证材料保存路径")) {
				savePath=anconfig.getSingleConfigInfoByName("佐证材料保存路径")+"\\"+idcard+"\\";
				// 输出的文件流
				File sf = new File(savePath);
				if (!sf.exists()) {
					sf.mkdirs();
				}
			}	
			if (!objectName.contains("mp4")) {//图片就进行压缩
				String style = "image/resize,m_fixed,w_1000";
				GetObjectRequest request = new GetObjectRequest(FilePath.bucketName, objectName);
				request.setProcess(style);
				ossClient.getObject(request, new File(savePath+"\\"+filename));
			} else {
				ossClient.getObject(new GetObjectRequest(FilePath.bucketName, objectName), new File(savePath+"\\"+filename));
			}
			// 获取文件的部分元信息。
			objectMeta = ossClient.getSimplifiedObjectMeta(FilePath.bucketName, objectName);
	
			// 关闭OSSClient。
			ossClient.shutdown();
		}
		return objectMeta;
	}
	
    public static String getUrl(String urlString){
    	String objectName = urlString.replaceAll(FilePath.accessUrl+"/", "");
		if(urlString.contains("?")) {
			objectName=objectName.substring(0, objectName.indexOf("?"));
		} 
		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(FilePath.endpoint, FilePath.accessKeyId, FilePath.accessKeySecret);

		// 设置URL过期时间为1小时。
		Date expiration = new Date(new Date().getTime() + 3600 * 1000);
		// 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
		URL url = ossClient.generatePresignedUrl(FilePath.bucketName, objectName, expiration);
		
        return url.toString();
    }
    
    /**此方法作废**/
	public void download(String urlString, String filename, String savePath) {
		try {
			// 构造URL
			URL url = new URL(urlString);
			// 打开连接
			URLConnection con = url.openConnection();
			// 设置请求超时为5s
			con.setConnectTimeout(5 * 1000);
			// 输入流
			InputStream is = con.getInputStream();
			// 1K的数据缓冲
			byte[] bs = new byte[1024];
			// 读取到的数据长度
			int len;
			// 输出的文件流
			File sf = new File(savePath);
			if (!sf.exists()) {
				sf.mkdirs();
			}
			OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);
			// 开始读取
			while ((len = is.read(bs)) != -1) {
				os.write(bs, 0, len);
			}
			// 完毕，关闭所有链接
			os.close();
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}
